package frsf.cidisi.exercise.tp1.utiles;

import frsf.cidisi.exercise.tp1.search.EstadoActualArqueologo;

public class MetodosUtiles {

	private double pesoPorUnidadOro;
	private double pesoPorUnidadRubi;
	private double pesoPorUnidadAnillo;
	private double pesoPorUnidadDiamante;
	private double pesoPorUnidadColgante;
	
	
	public MetodosUtiles(){
		
	}
	
	public void initState(){
		
		pesoPorUnidadOro = 0;
		pesoPorUnidadRubi = 0;
		pesoPorUnidadAnillo = 0;
		pesoPorUnidadDiamante = 0;
		pesoPorUnidadColgante = 0;
		
	}
	
	public double calcularPeso(double[] tesoros){
		
		double peso =	(tesoros[0] * pesoPorUnidadOro) 	+
						(tesoros[1] * pesoPorUnidadRubi) 	+ 
						(tesoros[2] * pesoPorUnidadAnillo) 	+ 
						(tesoros[3] * pesoPorUnidadDiamante) + 
						(tesoros[4] * pesoPorUnidadColgante); 
	
		return peso;
    }
    
    public boolean SePuedeCargar(double[] TesoroActual,double pesoAcoplado, double pesoMaximoAcoplado){
    	
    	//TODO Evalua si puede cargar el tesoro en el acoplado teniendo en cuenta el pesoMaximo permitido.
    	boolean puedeCargar = true;
    	
    	return puedeCargar;
    }
    
    public void sumarTesoro(double[] tesoroOrigen, double[] tesoroDestino){
        
    	for(int i=0; i<5; i++){
    	
    		tesoroDestino[i] += tesoroOrigen[i];
    	  	
    	}
    
    }
    
    public boolean hayTesoro(double[] tesoro){
    	
    	boolean hayTesoro = false;
    	
    	for(int i=0; i<5 && !hayTesoro; i++){
    		
    		if(tesoro[i]!=0){
    			hayTesoro = true;
    		}
    		
    	}
    	  	
    	return hayTesoro;
    }
    
    public boolean puedeLevantarTesoro(double[] tesoro, double[] tesorosAcoplado, double pesoMaximo){
    
    	boolean puedeLevantarTesoro = true;
    	
    	double pesoActualAcoplado = calcularPeso(tesorosAcoplado);
    	double pesoTesoroActualAldea = calcularPeso(tesoro);
    	    	
    	if(pesoMaximo<=(pesoActualAcoplado+pesoTesoroActualAldea)){
    		
    		puedeLevantarTesoro = false;
    		
    	}
    	
    	return puedeLevantarTesoro;
    }
    
    public boolean ObtenerFaltante (double pesoFaltante, EstadoActualArqueologo agState){
    	
    	boolean obtenerFaltante = false;
    	
    	if(agState.getTesoros()[agState.getPosicionAgente()-1][0]>0 ||
    			agState.getTesoros()[agState.getPosicionAgente()-1][1]>0 ||
    			agState.getTesoros()[agState.getPosicionAgente()-1][2]>0 ||
    			agState.getTesoros()[agState.getPosicionAgente()-1][3]>0 ||
    			agState.getTesoros()[agState.getPosicionAgente()-1][4]>0){
    		
    		obtenerFaltante = true;
    		
    	}
    		return obtenerFaltante;
    }
    
    public double distanciaEnLineaRecta(int[] v1,int[] v2){
    	
    	double distancia =0;
    	   	
    	distancia = Math.sqrt(Math.pow((v2[0]-v1[0]), 2)+Math.pow((v2[1]-v1[1]), 2));
    	   	
    	return distancia;
    }
    	

	public double getPesoPorUnidadOro() {
		return pesoPorUnidadOro;
	}

	public void setPesoPorUnidadOro(double pesoPorUnidadOro) {
		this.pesoPorUnidadOro = pesoPorUnidadOro;
	}

	public double getPesoPorUnidadRubi() {
		return pesoPorUnidadRubi;
	}

	public void setPesoPorUnidadRubi(double pesoPorUnidadRubi) {
		this.pesoPorUnidadRubi = pesoPorUnidadRubi;
	}

	public double getPesoPorUnidadAnillo() {
		return pesoPorUnidadAnillo;
	}

	public void setPesoPorUnidadAnillo(double pesoPorUnidadAnillo) {
		this.pesoPorUnidadAnillo = pesoPorUnidadAnillo;
	}

	public double getPesoPorUnidadDiamante() {
		return pesoPorUnidadDiamante;
	}

	public void setPesoPorUnidadDiamante(double pesoPorUnidadDiamante) {
		this.pesoPorUnidadDiamante = pesoPorUnidadDiamante;
	}

	public double getPesoPorUnidadColgante() {
		return pesoPorUnidadColgante;
	}

	public void setPesoPorUnidadColgante(double pesoPorUnidadColgante) {
		this.pesoPorUnidadColgante = pesoPorUnidadColgante;
	}
    
    
    
}
